package com.vast.admin.service.impl;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vast.admin.entity.Lawsuit;
import com.vast.admin.entity.LawsuitFlow;
import com.vast.admin.entity.LawsuitFlowChangeRecord;
import com.vast.admin.entity.enums.OperatorEum;
import com.vast.admin.entity.enums.QueryOrderEnum;
import com.vast.admin.mapper.LawsuitMapper;
import com.vast.admin.utils.QueryBuilder;
import com.vast.admin.utils.TableFieldColumnsUtils;
import com.vast.common.core.domain.entity.SysUser;
import com.vast.common.utils.StringUtils;
import com.vast.system.utils.Constant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Service
public class LawsuitService extends ServiceImpl<LawsuitMapper, Lawsuit> {

    @Autowired
    private LawsuitFlowService lawsuitFlowService;

    @Autowired
    private LawsuitFlowChangeRecordService flowChangeRecordService;

    public IPage<Lawsuit> queryList(SysUser manager, Page<Lawsuit> page, boolean listMode, String queryItems, String orderField, QueryOrderEnum order) {
        QueryWrapper<Lawsuit> queryWrapper = new QueryWrapper<>();
        Map<String, String> fieldColumns = TableFieldColumnsUtils.getInstance().getFieldTableColumns(Lawsuit.class);
        if (listMode) {
            // size 小于 0 不在查询 total 及分页，自动调整为列表模式。
            // 注意！！这个地方自己控制好！！
            page.setSize(-1);
        }
        if (!StringUtils.isEmpty(queryItems)) {
            List<QueryBuilder> queryBuilders = new ArrayList<>();
            String[] queryItemArr = queryItems.split(";");
            if(queryItemArr.length > 0){
                for (String queryItemStr : queryItemArr) {
                    String[] itemArr = queryItemStr.split(",");
                    if(itemArr.length == 3){
                        String as = itemArr[1];
                        String params = itemArr[2];
                        if(!StringUtils.isEmpty(params)){
                            queryBuilders.add(new QueryBuilder(itemArr[0], OperatorEum.valueOf(as),itemArr[2]));
                        }
                    }
                }
            }

            for (QueryBuilder queryBuilder : queryBuilders) {
                //查询字段
                String field = queryBuilder.getField();
                //查询参数值
                String params = queryBuilder.getParams();
                if (fieldColumns.containsKey(field) && !StringUtils.isEmpty(params)) {
                    //表属性
                    String tableColumn = fieldColumns.get(field);
                    if (queryBuilder.getAs() == OperatorEum.EQ) {
                        queryWrapper.eq(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LIKE){
                        queryWrapper.like(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LIKELEFT){
                        queryWrapper.likeLeft(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LIKERIGHT){
                        queryWrapper.likeRight(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.GE){
                        queryWrapper.ge(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LE){
                        queryWrapper.le(tableColumn, params);
                    }
                }
            }
        }

        if (!manager.isHasRole(Constant.SUPER_ADMIN)) {//超级管理员
            queryWrapper.eq(Lawsuit.COL_COMPANY_ID, manager.getCompanyId());
        }

        if (!StringUtils.isEmpty(orderField)) {
            String[] orderByColumns = orderField.split(",");
            String queryOrderByColumns = "";
            if (orderByColumns.length > 0) {
                StringBuilder sb = new StringBuilder();
                for (String orderByColumn : orderByColumns) {
                    if (fieldColumns.containsKey(orderByColumn)) {
                        sb.append(fieldColumns.get(orderByColumn)).append(",");
                    }
                }
                if (sb.length() > 0) {
                    queryOrderByColumns = sb.deleteCharAt(sb.length() - 1).toString();
                }
            }
            if (!StringUtils.isEmpty(queryOrderByColumns)) {
                if(order == null){
                    order = QueryOrderEnum.ASC;
                }
                if (order == QueryOrderEnum.ASC) {
                    queryWrapper.orderByAsc(queryOrderByColumns);
                } else if (order == QueryOrderEnum.DESC) {
                    queryWrapper.orderByDesc(queryOrderByColumns);
                }
            }

        }

        IPage<Lawsuit> result = baseMapper.selectPage(page, queryWrapper);
        for (Lawsuit record : result.getRecords()) {
            if(record.getLawsuitFlowId() > 0){
                //诉讼流程类型
                LawsuitFlow lawsuitFlow = lawsuitFlowService.getById(record.getLawsuitFlowId());
                if(lawsuitFlow != null){
                  record.setLawsuitFlowName(lawsuitFlow.getName());
                }
                //当前诉讼流程节点类型
                LawsuitFlow lawsuitFlowType = lawsuitFlowService.getById(record.getLawsuitFlowTypeId());
                if(lawsuitFlowType != null){
                    record.setLawsuitFlowTypeName(lawsuitFlowType.getName());
                }
            }
        }

        return result;
    }

    public boolean addOrUpdate(SysUser manager, Lawsuit bean) {
        if (bean.getId() == null) {
            bean.setCompanyId(manager.getCompanyId());
            bean.setCreateBy(manager.getUserId());
            bean.setUpdateBy(manager.getUserId());
            bean.setCreateTime(DateTime.now());
            bean.setUpdateTime(DateTime.now());
            bean.setValid(1);

            //流程变更记录
            LawsuitFlowChangeRecord flowChangeRecord = new LawsuitFlowChangeRecord();

            LawsuitFlow lawsuitFlow = lawsuitFlowService.getById(bean.getLawsuitFlowId());
            if(lawsuitFlow != null){
                List<LawsuitFlow> lawsuitFlows= lawsuitFlowService.list(new QueryWrapper<LawsuitFlow>().eq(LawsuitFlow.COL_PARENT_ID,lawsuitFlow.getId()).orderByAsc(LawsuitFlow.COL_SORT));
                if(lawsuitFlows != null && !lawsuitFlows.isEmpty()){
                    LawsuitFlow flow = lawsuitFlows.get(0); //创建诉讼后默认流程步骤为第一条
                    bean.setLawsuitFlowTypeId(flow.getId()); //设置当前诉讼流程类型id;
                    bean.setStatus(flow.getSort()); //设置默认完成创建步骤

                    flowChangeRecord.setLawsuitFlowId(flow.getId());
                    flowChangeRecord.setLawsuitFlowNodeName(flow.getName());
                    flowChangeRecord.setStatus(flow.getSort());

                }
            }
            //添加
            baseMapper.insert(bean);

            flowChangeRecord.setLawsuitId(bean.getId());
            flowChangeRecord.setRemark(bean.getRemark());
            flowChangeRecord.setCreateBy(manager.getUserId());
            flowChangeRecord.setUpdateBy(manager.getUserId());
            flowChangeRecord.setValid(1);
            flowChangeRecord.setCreateTime(DateTime.now());
            flowChangeRecord.setUpdateTime(DateTime.now());
            flowChangeRecordService.save(flowChangeRecord);

            return true;
        } else {
            bean.setUpdateBy(manager.getUserId());
            bean.setUpdateTime(DateTime.now());
            bean.setValid(1);
            baseMapper.updateById(bean);
//
            return true;
//            return roleMenuService.saveBatch(roleMenus);
        }
    }

    public Lawsuit info(SysUser manager, Long id) {
        Lawsuit bean = baseMapper.selectById(id);
        if(bean.getLawsuitFlowId() > 0){
            LawsuitFlow lawsuitFlow = lawsuitFlowService.getById(bean.getLawsuitFlowId());
            if(lawsuitFlow != null){
                bean.setLawsuitFlowName(lawsuitFlow.getName());
            }
        }
        return bean;
    }


    public boolean delete(SysUser manager, Long[] ids) {

        List<Long> idsList = java.util.Arrays.asList(ids);
        int count = baseMapper.deleteBatchIds(idsList);

        return count == ids.length;

    }

    public IPage<Lawsuit> getLawsuitDueByDays(Page<Lawsuit> page, int days) {
        IPage<Lawsuit> result = baseMapper.getLawsuitDueByDays(page,days);
        for (Lawsuit record : result.getRecords()) {
            if(record.getLawsuitFlowId() > 0){
                //诉讼流程类型
                LawsuitFlow lawsuitFlow = lawsuitFlowService.getById(record.getLawsuitFlowId());
                if(lawsuitFlow != null){
                    record.setLawsuitFlowName(lawsuitFlow.getName());
                }
                //当前诉讼流程节点类型
                LawsuitFlow lawsuitFlowType = lawsuitFlowService.getById(record.getLawsuitFlowTypeId());
                if(lawsuitFlowType != null){
                    record.setLawsuitFlowTypeName(lawsuitFlowType.getName());
                }
            }
        }
        return result;
    }
}
